package appIdeasScrumer.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public final class Archivo {

	protected static Log log = LogFactory.getLog(new Archivo().getClass());

	public static final void escribirArchivo(InputStream iStream, String destino)
			throws IOException {

		log.info("Archivo: escribirArchivo: " + destino);
		OutputStream bos = new FileOutputStream(destino);
		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		while ((bytesRead = iStream.read(buffer, 0, 8192)) != -1) {
			bos.write(buffer, 0, bytesRead);
		}
		bos.close();
	}

	public static final void copiarArchivo(String origen, String destino)
			throws IOException {
		log.info("Archivo: copiarArchivo: inicio");
		File o = new File(origen);
		//
		String destinoDirectorio = destino.substring(0, destino
				.lastIndexOf(Constantes.SLASH));
		if (!(new File(destinoDirectorio)).exists())
			crearDirectorio(destinoDirectorio);
		//
		File d = new File(destino);

		BufferedInputStream in = new BufferedInputStream(new FileInputStream(o));
		BufferedOutputStream out = new BufferedOutputStream(
				new FileOutputStream(d));

		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
			out.write(buffer, 0, bytesRead);
		}
		in.close();
		out.flush();
		out.close();
		log.info("Archivo: copiarArchivo: fin - " + destino);
	}

	public static final boolean crearDirectorio(String dir) throws IOException {
		boolean rc = true;
		File d = new File(dir);
		if (!d.exists()) {
			rc = d.mkdirs();
			if (!rc) {
				log
						.info("Archivo: crearDirectorio: No se pudo crear el directorio: "
								+ dir);
			} else {
				log
						.info("Archivo: crearDirectorio: Directorio creado - "
								+ dir);
			}
		}
		return rc;
	}
	
	public static final boolean renombrarArchivo(String file, String reemplazo) throws IOException {
		boolean ok = false;
		try {
			
			File reemp = new File(reemplazo);
			File archivo = new File(file);
			if (archivo.exists()) {
				if (archivo.renameTo(reemp)) {
					log.info("Archivo: renombrarArchivo: Archivo Renombrado Ok -> "
							+ reemp.getName());
				}
			}else{
				log.info("Archivo: renombrarArchivo: El archivo no existe");
			}
			ok = true;
		} catch (Exception e) {
			log.error("Archivo: renombrarArchivo: " + e.getMessage());
		}
		return ok;
	}
	
	public static final boolean eliminarDirectorio(String dir) {
		boolean ok = false;
		try {
			File carpeta = new File(dir);
			if (carpeta.exists()) {
				eliminaraSubcarpetas(carpeta);
				if (carpeta.delete()) {
					log.info("Archivo: eliminarDirectorio: "
							+ carpeta.getPath());
				}
			}
			ok = true;
		} catch (Exception e) {
			log.error("Archivo: eliminarDirectorio: " + e.getMessage());
		}
		return ok;
	}
	
	public static final boolean eliminarArchivo(String file) {
		boolean ok = false;
		try {
			File archivo = new File(file);
			if (archivo.exists()) {
				if (archivo.delete()) {
					log.info("Archivo: eliminarArchivo: Archivo Eliminado -> "
							+ archivo.getName());
				}
			}else{
				log.info("Archivo: eliminarArchivo: El archivo no existe");
			}
			ok = true;
		} catch (Exception e) {
			log.error("Archivo: eliminarArchivo: " + e.getMessage());
		}
		return ok;
	}

	public static void eliminaraSubcarpetas(File carpeta) {
		try {
			if (carpeta.delete()) {
			} else {
				File[] a = carpeta.listFiles();
				for (int w = 0; w < a.length; w++) {
					if (a[w].delete()) {
						carpeta.delete();
					} else {
						Archivo.eliminaraSubcarpetas(a[w]);
					}
				}
			}
		} catch (Exception e) {
			log.error("No se pudo eliminar la carpeta " + e.getMessage());
		}
	}

	public static void downloadFile(String virtualFilename, String source,
			HttpServletResponse response) throws IOException,
			FileNotFoundException {

		// String filename = "test.img";
		// String source = "c:\\download\\test1.img";

		int data;
		ServletOutputStream stream = null;
		BufferedInputStream buffer = null;

		try {

			response.setHeader("Content-Disposition", "attachment; filename=\""
					+ virtualFilename + "\"");
			// read file
			log.info("source :" + source);

			buffer = new BufferedInputStream(new FileInputStream(source));

			// get out
			stream = response.getOutputStream();

			// do Tx.
			log.info("before read");
			while ((data = buffer.read()) != -1)
				stream.write(data);
			log.info("after read");

			buffer.close();

			// write whatever to stream
			// stream.flush();
			stream.close();

		} catch (FileNotFoundException e){
			log.error("Archivo No Existe");
		} catch (Exception e) {
			log.info("Descarga Cancelada");
		} finally {
			response.setHeader("Content-Disposition", null);
			//
			if (stream != null) {
				// stream.flush();
				// stream.close();
			}
			//
			if (buffer != null) {
				buffer.close();
			}
		}
	}
}
